import Cookies from "js-cookie";
import router from "@/router";
import Qs from "qs";
import { ElMessage } from "element-plus";
import axios, { type AxiosResponse } from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { useUserStore } from "@/stores/admin/index"; 

NProgress.configure({
  easing:'ease',//动画方式
  speed:500,//递增进度条的速度
  showSpinner:false,//是否显示加载ico
  trickleSpeed:200,//自动递增间隔
  minimum:0.3//初始化时的最小百分比
})


// 通过继承的方式扩展AxiosResponse类型，增加我们需要的字段
declare interface TyepResponse extends AxiosResponse {
  /**
   * 错误号,200表示成功，10006表示令牌过期
   */
  errno: number;
  /**
   * 返回的信息
   */
  errmsg: string;
}

let baseURL = "";
//process.env.NODE_ENV //development 开发环境 //production 生产环境（build后的代码）
if (process.env.NODE_ENV === "development") {
  //配置项目环境
  baseURL = "/m.api";
} else {
  baseURL = "http://zxwyit.cn:8080/m.api";
}

// 实例对象
let instance = axios.create({
  // baseURL,
  timeout: 5000,
  baseURL: "/m.api",
});

// 添加请求拦截器
instance.interceptors.request.use(
  (config) => {
    NProgress.start();
    const token: string | undefined = Cookies.get("token");
    if (token) {
      config.headers = config.headers || {};
      config.headers["adminToken"] = token;
    }
    return config;
  },
  (error) => {
    NProgress.start();
    console.log(error);
    return Promise.reject(error);
  }
);

const requestType = ["_mt=edit", "_mt=create", "_mt=delete", "_mt=update"];
//响应拦截器
instance.interceptors.response.use(
  async (result) => {
    NProgress.done();
    let data = result.data;
    let { errno, errmsg } = data; //解构
    let path = router.currentRoute.value.fullPath;
    if (10006 === errno) {
      const store = useUserStore();
      //状态码为10006管理员未登录提示错误信息跳转到登录页面
      const configData = result.config.data || ""; //获取接口请求需要的数据
      const index = requestType.findIndex((item) => configData.includes(item)); //查找请求类型是否刷新，-1的不需要刷新
      if (-1 === index) {
        //-1表示不需要无感刷新，跳转到登录页面
        ElMessage.error(errmsg);
        router.replace({ path: "/login", query: { back: path } }); //登录后需要跳转的页面
        return;
      } else {
        //这里表示需要的无感刷新
        const { username, password } = store.$state.userpassword //获取登录用户名称和密码
        let loginData = {_gp:'admin',_mt:'login',username,password}//重新获取令牌
        const {errno,errmsg,data} = await post(loginData);//await同步操作，异步处理同步化
        if(200===errno){
          Cookies.set("token",data);//保存令牌
        }else{
          ElMessage.error(errmsg)
          router.replace({path:'/Login',query:{back:path}})
          return
        }
        // 重新发送上次请求
        return instance.request(result.config)
      }
    }
    return data;
  },
  (err) => {
    NProgress.done();
    return Promise.reject(err);
  }
);

function get(params?: object): Promise<TyepResponse> {
  return instance.get("", { params });
}

function post(data: object, params?: object): Promise<TyepResponse> {
  return instance.post("", Qs.stringify(data), { params });
}
export function $upload(data: any) {
  return instance.post("../upload/admin", data);
}
export { baseURL, get, post };
